package com.linzelin.config;

import com.linzelin.filter.JwtVerityFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;

/**
 * @author 君未洋
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //继承了这个类之后就相当于这个类拥有所有的SpringSecurity所有的配置


    @Autowired
    private RsaKeyProperties prop;

    /**
     * 配置SpringSecurity基本配置
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /*这里就是配置基本的登录页面,角色,登录相关的提交等等等*/
        http.authorizeRequests()
                .antMatchers("/**").hasAnyRole("USER")
                .anyRequest()
                .authenticated();
        //这里就代表/**下的资源只有在认证通过之后才能访问到
        //释放掉处理配置的这些基本页面
        /*配置下注销按钮*/
        http.logout().logoutUrl("/logout")
                .invalidateHttpSession(true)
                //这个就是配置的是否清空session
                .permitAll();
        //这里还要再配置对应的拦截要重新配置

        /*配置登录对应的拦截器*/
        http.addFilter(new JwtVerityFilter(super.authenticationManager(), prop))
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        //这里就是禁用掉session了,表示我们不再使用session


        http.csrf().disable();
        //关闭csrf,有一个要注意的就是csrf被认为是后面不能再操作了,所以你会发现这个后面是没有and的
    }
}
